#ifndef MAC_ADDRESS_H
#define MAC_ADDRESS_H
#include <Arduino.h>
// warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
// 在C++11中有明确规定
// char* p = "abc"; // valid in C, invalid in C++
// 如果你进行了这样的赋值，那么编译器就会跳出诸如标题的警告。但是如果你改成下面这样就会通过warning
// char* p = (char*)"abc"; //OK
// 或者这样：
// char const *p="abc";//OK
//  这到底是怎么一回事呢？事实上，我们在学习c或者c++的时候都知道，如果在赋值操作的时候，等号两边的变量类型不一样，那么编译器会进行一种叫做 implicit conversion 的操作来使得变量可以被赋值。
//  在我们上面的表达式中就存在这样的一个问题，等号右边的"abc"是一个不变常量，在c++中叫做string literal，type是const char *，而p则是一个char指针。如果强行赋值会发生什么呢？没错，就是将右边的常量强制类型转换成一个指针，结果就是我们在修改一个const常量。编译运行的结果会因编译器和操作系统共同决定，有的编译器会通过，有的会抛异常，就算过了也可能因为操作系统的敏感性而被杀掉。
//  像这种直接将string literal 赋值给指针的操作被开发者们认为是deprecated，只不过由于以前很多代码都有这种习惯，为了兼容，就保留下来了。
char const *address[] =
    {
        "58:BF:25:32:D2:0C",
        "58:BF:25:33:48:5C",
        "58:BF:25:33:2E:28",
        "58:BF:25:33:1A:BC",
        "94:3C:C6:9E:A6:28",
        "94:3C:C6:B0:FB:C8",
        "58:BF:25:32:D5:80",
        "94:3C:C6:9E:A5:DC",
        "58:BF:25:33:44:14",
        "58:BF:25:32:C9:AC",
        "58:BF:25:33:43:CC",
        "94:3C:C6:9E:A5:E0",
        "58:BF:25:33:44:48",
        "58:BF:25:32:D0:94",
        "58:BF:25:32:CB:48",
        "98:CD:AC:B2:C1:1C"};

int mac_str_to_bin(char const *str, uint8_t *mac)
{
    int i;
    char *s, *e = NULL;
    if ((mac == NULL) || (str == NULL))
    {
        return -1;
    }
    s = (char *)str;
    for (i = 0; i < 6; ++i)
    {
        mac[i] = s ? strtoul(s, &e, 16) : 0;
        if (s)
            s = (*e) ? e + 1 : e;
    }
    return 0;
}
#endif